package edu.yngsxy.communityservice.core.model.common;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
 * View Object（视图对象） 是三层架构中适配前端展示的对象，用于封装前端所需数据；
 * 统一返回结果类
 * 用于标准化API接口或方法调用的返回格式
 */
@Data
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 状态码
     */
    @Schema(title = "状态码", description = "响应状态码：成功为200，失败为500，参数错误为400，未登录/授权为401，禁止访问/无权限为403，资源不存在为404", example = "200")
    private int code;

    /**
     * 返回消息
     */
    // 响应信息：如成功时为"操作成功"，失败时为具体错误描述（如"参数校验失败"）
    @Schema(title = "响应信息", description = "如成功时为\"操作成功\"，失败时为具体错误描述（如\"参数校验失败\"）", example = "操作成功")
    private String msg;

    /**
     * 返回数据
     */
    // 响应数据：成功时返回业务数据（如用户列表），失败时可为null
    @Schema(title = "响应数据",description = "成功时返回业务数据（如用户列表），失败时可为null")
    private T data;

    /**
     * 构造方法
     */
    public Result() {
    }

    /**
     * 构造方法
     * @param code 状态码
     * @param message 消息
     * @param data 数据
     */
    public Result(int code, String message, T data) {
        this.code = code;
        this.msg = message;
        this.data = data;
    }
    public static <T> Result<T> success(String message) {
        return new Result<>(ResultCodeEnum.SUCCESS.getCode(), message, null);
    }
    /**
     * 返回成功结果（带数据）
     * @param data 数据
     * @param <T> 数据类型
     * @return 成功结果
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(ResultCodeEnum.SUCCESS.getCode(), "操作成功", data);
    }

    /**
     * 返回成功结果（不带数据）
     * @param <T> 数据类型
     * @return 成功结果
     */
    public static <T> Result<T> success() {
        return success(null);
    }

    /**
     * 返回成功结果（自定义消息）
     * @param message 消息
     * @param data 数据
     * @param <T> 数据类型
     * @return 成功结果
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(ResultCodeEnum.SUCCESS.getCode(), message, data);
    }

    /**
     * 返回错误结果（带消息）
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 错误结果
     */
    public static <T> Result<T> error(String message) {
        return new Result<>(ResultCodeEnum.SYSTEM_ERROR.getCode(), message, null);
    }

    /**
     * 返回错误结果（自定义状态码和消息）
     * @param code 状态码
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 错误结果
     */
    public static <T> Result<T> error(int code, String message) {
        return new Result<>(code, message, null);
    }

    /**
     * 返回参数错误结果
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 参数错误结果
     */
    public static <T> Result<T> paramError(String message) {
        return new Result<>(ResultCodeEnum.PARAM_ERROR.getCode(), message, null);
    }

    /**
     * 返回未授权结果
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 未授权结果
     */
    public static <T> Result<T> unauthorized(String message) {
        return new Result<>(ResultCodeEnum.UNAUTHORIZED.getCode(), message, null);
    }

    /**
     * 返回禁止访问结果
     * @param message
     * @return
     * @param <T>
     */
    public static <T> Result<T> forbidden(String message) {
        return new Result<>(ResultCodeEnum.FORBIDDEN.getCode(), message, null);
    }
    /**
     * 返回资源不存在结果
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 资源不存在结果
     */
    public static <T> Result<T> notFound(String message) {
        return new Result<>(ResultCodeEnum.NOT_FOUND.getCode(), message, null);
    }

    /**
     * 判断是否成功
     * @return 是否成功
     */
    public boolean isSuccess() {
        return this.code == ResultCodeEnum.SUCCESS.getCode();
    }

}

